#include "ixemelle_criterion.h"

struct ixemelle_criterion_struct{
	char * str;
	char* tag;
	char* indicateur;

	struct ixemelle_criterion_struct* suivant;
};

void copy_tab(char ** dest, char * source, int debut, int fin){
	;
}

 /*on cherche a connaitre la taille des string, pour savoir quelle taille allouer*/
int taille_string(char * str){
    int i = 0;
    while(str[i] != '\0'){
        i++;
    }
    return i+1;/* on rajoute 1 pour \0 */
}

int point_present(char * str){
	int i = 0;
    while(str[i] != '\0'){
        if( str[i] == '.')
        	return 1;
        i++;
    }
    return 0;
}

int nb_tag(char * str){
	int nb = 0, i = 0;
	while(str[i] != '\0'){
		if( str[i] == '.')
			nb++;
		else if( str[i] == '>')
			nb++;
		else if( str[i] == '<')
			nb++;
		i++;
	}
	return nb;
}

int search_point(char * str){
    int i = 0;
	while(str[i] != '\0'){
		if( str[i] == '.')
			return i;
		i++;
	}
	return i;
}

int first_word_is_value(char * str){
	if((str[0] >= 65 && str[0] <= 90) || (str[0] >= 97 && str[0] <= 122))
        return 1;
	else if(str[0] == ' ')
        if((str[1] >= 65 && str[1] <= 90) || (str[1] >= 97 && str[1] <= 122))
            return 1;

    return 0;
}

int point_necessaire(char * str){/*decrit les condition d'ajout d'un point*/
	if (nb_tag(str) == 0 || first_word_is_value(str) == 1)
		return 1;

	return 0;
}

int ixemelle_criterion_create ( ixemelle_criterion * ic , const char * crit) {
	int nbChar = 0, i = 0,j, aCopier, entreCrochets = 0, nombreEspace, x = 0; /* toute ces variable sont utilisees pour obtenir le format desirer dans les criterion*/
	char c;
	*ic =  malloc(sizeof( struct ixemelle_criterion_struct ) );


    nbChar = taille_string(crit);




    char * correction = calloc(nbChar,sizeof(char) + 5);
    if(point_present(crit)){
    	if( crit[1] != '.' && crit[0] != '.' ){/* alors le point est mal place dans le string*/
    		strncpy(correction, &crit[search_point(crit)], nbChar - search_point(crit) );

    		/*on copie maintenant le reste de la chaine de car*/
    		x =  search_point(crit);
    		while(x < nbChar - search_point(crit) ){
    			correction[  nbChar - search_point(crit) + x ] = crit[x];
    			x++;
    		}
    	}
    	else{/* on recopie la chaine, le point est bien positionne */
    		j = 0;
    		while(crit[j] != '\0'){
    			correction[j] = crit[j];
    			j++;
    		}
    	}
    }
    else if ( point_necessaire(crit)){/* on verifie qu'il existe au moin un autre tag */
    	/* alors il faut rajouter un point */
    	j = 0;
    	correction[0] = ' ';
    	correction[1] = '.';
    	correction[2] = ' ';
    	while(crit[j] != '\0'){
    		correction[j+3] = crit[j];
   			j++;
    	}
    }
    else{
		j = 0;
    	while(crit[j] != '\0'){
    		correction[j] = crit[j];
   			j++;
    	}
    }


	char * correction2 = calloc(nbChar,sizeof(char) +5 );/*on rajoute un espace si il manque l'espace de debut de chaine*/
    /* on corrige la chaine de caractere passee en argument */

    /* on copie les caracteres de la chaine*/
    j = 0;
    nombreEspace = 0;

    while(correction[i] != '\0'){
    	aCopier = 1;

    	if(correction[i] != ' ')
    		nombreEspace = 0;
    	else
    		nombreEspace++;

    	if(correction[i] == '[' ){
    		entreCrochets = 1;
    	}
    	else if(correction[i] == ']' ){
    		entreCrochets = 0;
    	}
    	else if(correction[i] == ' ' && entreCrochets){/*enleve les espace entre crochets*/
        	aCopier = 0;
    	}
    	else if(correction[i] == ' ' && nombreEspace > 1){/*enleve les doubles espaces*/
    		aCopier = 0;
    		nombreEspace++;
    	}
    

    	if(i == 0 && correction[i] != ' '){/*veille a ce qu'il y ai un espace au debut du criterion*/
            correction2[0] = ' ';
            j++;
    	}


    	if(aCopier){
            correction2[j] = correction[i];
            j++;
    	}
        i++;
    }



	(*ic)->str = calloc(nbChar+5,sizeof(char) );/*on utilise calloc au cas ou il y ai des reductions de la chaine initiale*/

	i = 0;
    while(i < nbChar){
        (*ic)->str[i] = correction2[i];
        i++;
    }

	free(correction);
    free(correction2);

    /*on remplit notre criterion*/
    if(tag_avant_indicateur((*ic)->str[i])){
    	;
    }
    if(attribut_avant_indicateur((*ic)->str[i])){

    }
    if(indicateur_present((*ic)->str[i])){
    	;
    }

    /*on cree un suivant avec les elements que nous n'avons pas utilise*/


	return XMLIGHT_CRITERION_OK;
}

void ixemelle_criterion_destroy ( ixemelle_criterion * ic){
    free((*ic)->str);
    free(*ic);
}



 void ixemelle_criterion_fprint ( FILE * output ,
					ixemelle_criterion ic) {
 	fprintf(output, "%s\n", ic->str );
 }


int ixemelle_criterion_satisfy ( ixemelle_criterion ic,
					list_forest_position pos ) {

}

